﻿//给你链表的头节点 head ，每 k 个节点一组进行翻转，请你返回修改后的链表。
//
//k 是一个正整数，它的值小于或等于链表的长度。
//如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
//
//你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
//
//输入：head = [1, 2, 3, 4, 5], k = 2
//输出：[2, 1, 4, 3, 5]
//
//输入：head = [1, 2, 3, 4, 5], k = 3
//输出：[3, 2, 1, 4, 5]
//
//提示：
//	链表中的节点数目为 n
//	1 <= k <= n <= 5000
//	0 <= Node.val <= 1000


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        // 1.先求出需要逆序多少组

        int n = 0;
        ListNode* cur = head;
        while (cur) {
            cur = cur->next;
            n++;
        }
        n /= k;
        // 2.重复n次：⻓度为k的链表的逆序即可

        ListNode* newHead = new ListNode(0);
        ListNode* prev = newHead;
        cur = head;
        for (int i = 0; i < n; i++) {
            ListNode* tmp = cur;
            for (int j = 0; j < k; j++) {
                ListNode* next = cur->next;
                cur->next = prev->next;
                prev->next = cur;
                cur = next;
            }
            prev = tmp;
        }
        // 把不需要翻转的接上

        prev->next = cur;
        cur = newHead->next;
        delete newHead;
        return cur;
    }
};






